blob: 34b66115e9e4a9ad047035fbe5ad7eb666eec5f4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
import * as React from "react"
import { type SearchParams } from "@/types/table"
import { getValidFilters } from "@/lib/data-table"
import { Skeleton } from "@/components/ui/skeleton"
import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
import { Shell } from "@/components/shell"
import { searchParamsRfqsForVendorsCache } from "@/lib/rfqs/validations"
import { RfqsVendorTable } from "@/lib/vendor-rfq-response/vendor-rfq-table/rfqs-table"
import { getServerSession } from "next-auth"
import { authOptions } from "@/app/api/auth/[...nextauth]/route"
import Link from "next/link"
import { Button } from "@/components/ui/button"
import { LogIn } from "lucide-react"
import { getRfqResponsesForVendor } from "@/lib/vendor-rfq-response/service"
interface IndexPageProps {
searchParams: Promise<SearchParams>
}
export default async function IndexPage(props: IndexPageProps) {
const searchParams = await props.searchParams
const search = searchParamsRfqsForVendorsCache.parse(searchParams)
const validFilters = getValidFilters(search.filters)
// Get session
const session = await getServerSession(authOptions)
// Check if user is logged in
if (!session || !session.user) {
// Return login required UI instead of redirecting
return (
<Shell className="gap-6">
<div className="flex items-center justify-between">
<div>
<h2 className="text-2xl font-bold tracking-tight">
RFQ
</h2>
<p className="text-muted-foreground">
RFQ를 응답하고 커뮤니케이션을 할 수 있습니다.
</p>
</div>
</div>
<div className="flex flex-col items-center justify-center py-12 text-center">
<div className="rounded-lg border border-dashed p-10 shadow-sm">
<h3 className="mb-2 text-xl font-semibold">로그인이 필요합니다</h3>
<p className="mb-6 text-muted-foreground">
RFQ를 확인하려면 먼저 로그인하세요.
</p>
<Button size="lg" asChild>
<Link href="/partners">
<LogIn className="mr-2 h-4 w-4" />
로그인하기
</Link>
</Button>
</div>
</div>
</Shell>
)
}
// User is logged in, proceed with vendor ID
const vendorId = session.user.companyId
// Validate vendorId (should be a number)
const idAsNumber = Number(vendorId)
if (isNaN(idAsNumber)) {
// Handle invalid vendor ID (this shouldn't happen if authentication is working properly)
return (
<Shell className="gap-6">
<div className="flex items-center justify-between">
<div>
<h2 className="text-2xl font-bold tracking-tight">
RFQ
</h2>
</div>
</div>
<div className="flex flex-col items-center justify-center py-12 text-center">
<div className="rounded-lg border border-dashed p-10 shadow-sm">
<h3 className="mb-2 text-xl font-semibold">계정 오류</h3>
<p className="mb-6 text-muted-foreground">
업체 정보가 올바르게 설정되지 않았습니다. 관리자에게 문의하세요.
</p>
</div>
</div>
</Shell>
)
}
// If we got here, we have a valid vendor ID
const promises = Promise.all([
getRfqResponsesForVendor({
...search,
filters: validFilters,
}, idAsNumber)
])
return (
<Shell className="gap-2">
<div className="flex items-center justify-between space-y-2">
<div className="flex items-center justify-between space-y-2">
<div>
<h2 className="text-2xl font-bold tracking-tight">
RFQ
</h2>
<p className="text-muted-foreground">
RFQ를 응답하고 커뮤니케이션을 할 수 있습니다.
</p>
</div>
</div>
</div>
<React.Suspense fallback={<Skeleton className="h-7 w-52" />}>
{/* DateRangePicker can go here */}
</React.Suspense>
<React.Suspense
fallback={
<DataTableSkeleton
columnCount={6}
searchableColumnCount={1}
filterableColumnCount={2}
cellWidths={["10rem", "40rem", "12rem", "12rem", "8rem", "8rem"]}
shrinkZero
/>
}
>
<RfqsVendorTable promises={promises} />
</React.Suspense>
</Shell>
)
}
|